1. panic是什麼?
程式在運行時,發生意料之外的程式異常。例如: 訪問,不存在的array。
panic,可以翻譯成,運行時恐慌。
2. panic的錯誤訊息、退出狀態碼
package main
func main() {
s1 := []int{0, 1, 2, 3, 4}
e5 := s1[5]
_ = e5
}
https://play.golang.org/p/J1SGtPc1t4Z
以下,對錯誤代碼說明。
panic: runtime error: index out of range [5] with length 5
這一行,其中的"runtime error"的涵義,這是ㄧ個runtime程式碼包中拋出的panic。
goroutine 1 [running]
代表有一個ID為1的goroutine在此panic被引發的時候,正在運行。
main.main()
/tmp/sandbox585672283/prog.go:5 +0x1b
表示,這個 main package的main函數。下一行,指出哪一行程式碼發生panic。
Program exited: status 2.
表示,這個程式退出的狀態代碼是2,結束運行。
只要退出狀態代碼不是0,就意味著程式運行非正常結束。
3. panic引發到程式終止,大致過程
某個函數中的某一行程式碼,有意或者無意地引發panic。
從這個時候開始,panic情況會被紀錄起來,並且該程式的控制權,會立即從此行程式碼轉移至,呼叫其所屬函數的那一行程式碼上。
這也意味著,發生panic的程式碼,執行立即終止。然後,控制權又會立即轉移至上一級,呼叫的程式碼處。控制權會ㄧ級ㄧ級,沿著呼叫方的反方向傳播到頂端,也就是我們編寫的最外層函數那裡。
這裡的最外層函數指的是Go函數,對於主 goroutine來說,就是 main函數。但控制權也不會停留在那裡,而是被Go語言運行系統回收。
然後,程式崩潰並終止運行。panic的情況會隨著傳播過程,逐漸地累積,並在程式終止之前印出來。
參考來源:
郝林-Go语言核心36讲
https://github.com/hyper0x/Golang_Puzzlers